package com.coolxiaoyao.web.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * @author Kerry on 18/09/20
 */

public class SerializationUtil {

    private static ObjectMapper objectMapper;

    public synchronized static void init() {
        objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    public static String toJsonOrString(@NotNull Object msg) {
        if (objectMapper == null) {
            init();
        }
        if (msg instanceof String) {
            return (String) msg;
        } else if (msg instanceof Number) {
            return String.valueOf(msg);
        } else if (msg.getClass().isPrimitive()) {
            return String.valueOf(msg);
        }
        try {
            return objectMapper.writeValueAsString(msg);
        } catch (JsonProcessingException ignored) {
        }
        return msg.toString();
    }

    public static String toJson(@NotNull Object msg) throws JsonProcessingException {
        if (objectMapper == null) {
            init();
        }
        return objectMapper.writeValueAsString(msg);
    }


    public static byte[] toJsonByteArr(@NotNull Object msg) throws JsonProcessingException {
        if (objectMapper == null) {
            init();
        }
        return objectMapper.writeValueAsBytes(msg);
    }


    public static <T> T fromJson(@NotNull byte[] data, Class<T> clazz) throws IOException {
        if (objectMapper == null) {
            init();
        }
        return objectMapper.readValue(data, clazz);
    }


    public static <T> T fromJson(@NotNull String json, Class<T> clazz) throws IOException {
        if (objectMapper == null) {
            init();
        }
        return objectMapper.readValue(json, clazz);
    }
}
